﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace ClassLibrary1 {
    /// <summary>
    /// 多线程共享原子操作
    /// Interlocked.Increment　　　　原子操作，递增指定变量的值并存储结果。
    /// Interlocked.Decrement 原子操作，递减指定变量的值并存储结果。
    /// Interlocked.Add 原子操作，添加两个整数并用两者的和替换第一个整数
    /// Interlocked.CompareExchange(ref a, b, c); 原子操作，a参数和c参数比较，  相等b替换a，不相等不替换。
    /// </summary>
    public class InterLock {
        public static int Maxinum(ref int target, int value)
        {
            int currentValue = target, startVal, desiredVal;
            do
            {
                startVal = currentValue;
                desiredVal = Math.Max(startVal, value);//基于startVal和value计算期望值desiredVal
                //高并发，线程被抢占情况下，target值会发生改变。
                //target startVal相等说明没改变，desiredVal直接替换。
                currentValue = Interlocked.CompareExchange(ref target, desiredVal, startVal);
            }
            while (startVal != currentValue);//不相等说明，target值已经被其他线程改动。自动继续
            return desiredVal;
        }
    }
}
